package com.mazaiting;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.List;

import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import com.mazaiting.one.ServerHandler;
import com.mazaiting.two.ServerProtocolCodecFactory;

/**
 * 服务启动类
 * 用纯Mina2.x写的一个服务器实现，其不依赖任何第三方框架，运行时也不需要类似Tomcat的服务器
 * 它比较适用后台服务（尽管也支持HTML页面），其内部同时支持TCP（自定义协议）和HTTP（HTTP1.0/1.1协议）请求
 * 下面的示例只演示了比较核心的处理实现，供学习之用
 * @author mazaiting
 * 服务启动后，可用浏览器访问下面两个地址
 * 1、http://127.0.0.1:8000/，这时浏览器会显示这几个字：欢迎访问由Mina2.0.16编写的Web服务器
 * 2、http://127.0.0.1:8000/login，这时浏览器会显示这几个字：登录成功
 */
public class MainApp {
	public static void main(String[] args) throws IOException {
        NioSocketAcceptor acceptor = new NioSocketAcceptor();
        //这里并未配置backlog，那么它会采用操作系统默认的连接请求队列长度50
        //详见org.apache.mina.core.polling.AbstractPollingIoAcceptor类源码的96行
        //acceptor.setBacklog(0);
        acceptor.setReuseAddress(true);
        acceptor.getSessionConfig().setWriteTimeout(10000);
        acceptor.getSessionConfig().setBothIdleTime(90);
//        acceptor.getFilterChain().addLast("logger", new LoggingFilter());
        acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ServerProtocolCodecFactory()));
//        acceptor.getFilterChain().addLast("executor", new ExecutorFilter());
        acceptor.setHandler(new ServerHandler());
        //服务端绑定两个端口，8000用于接收并处理HTTP请求，9000用于接收并处理TCP请求
        List<SocketAddress> socketAddresses = new ArrayList<>();
        socketAddresses.add(new InetSocketAddress(8000));
        socketAddresses.add(new InetSocketAddress(9000));
        acceptor.bind(socketAddresses);
        //判断服务端启动与否
        if(acceptor.isActive()){
            System.out.println("写 超 时: 10000ms");
            System.out.println("发呆配置: Both Idle 90s");
            System.out.println("端口重用: true");
            System.out.println("服务端初始化完成......");
            System.out.println("服务已启动...开始监听..." + acceptor.getLocalAddresses());
        }else{
            System.out.println("服务端初始化失败......");
        }
    }
}
